package com.tedu.api.list;

import org.junit.Test;

import java.util.*;

/**
 * Collection顶级集合容器
 * List集合【接口】继承于Collection【接口】
 * List集合:存储重复并且有序的元素
 * 注意：List集合类似数组，有些方法与数组使用一致
 * List集合【接口】
 * java.util.ArrayList：数组实现【常用】  存在list方法【重写】
 * java.util.LinkedList：链表实现
 * 以上两个类使用方法完全一致
 */
public class ListAPI {
    /**
     * List接口--提供get方法，可以被ArrayList类重写
     * get(int index)   返回值:E   泛型
     * 作用：通过下标获取集合元素的方法
     */
    @Test
    public void testGet() {
        //多态方法：创建父类引用指向子类对象方案【常用:调父、子方法，方法相同:重写】
        //重写调用子类方法，如果子类没有重写，调用父类方法
        //List<String> list=new ArrayList<>();
        //list.get(0);//重写：调用子类的get方法
        //直接创建实现类对象:调用ArrayList方法
        //ArrayList<String> al=new ArrayList<>();
        //al.get(0);//儿子
        List<String> list = new ArrayList<>();
        list.add("死掉的水");
        list.add("战斗的水");
        list.add("青春的水");
        System.out.println("打印List集合：" + list);
        //获取下标：1
        String index = list.get(1);//取出，从0开始
        System.out.println("取出集合元素：" + index);
        //遍历集合内容--普通for
        for (int i = 0; i < list.size(); i++) {//i指的是下标
            String str = list.get(i);//取出的=打印就可以  String也可以
            System.out.println("获取到集合的元素：" + index);
        }
    }

    /**
     * List接口方法
     * 添加、修改、移除
     * add(可以传两个参数   int index,E e)方法     添加        返回值：void(空)  重载方法
     * 作用：将给定元素插入到指定位置
     * set方法    修改      返回值；E  泛型Object
     * 作用：将给定元素设置到指定的位置上【替换】
     * remove(int index)方法    移除    返回值:E     重载方法
     * Collection接口 remove方法使用一致
     */
    @Test
    public void testASR() {
        List<String> list = new ArrayList<>();//创建集合
        list.add("one");
        list.add("two");
        list.add("three");
        //需求：在集合  two元素前添加  "2"
        list.add(1, "2");//index1.element"2"(在第// 二个元素前加一个2)
        System.out.println("插入元素：" + list);
        //需求：在集合  2元素 2元素替换成 二
        list.set(1, "二");
        System.out.println(list);
        list.remove(1);
        System.out.println(list);
        //需求:删除集合中”二“的元素
        list.remove("二");  //Collection接口remove方法
        list.remove(1);//List接口remove，通过下标，删元素
        System.out.println("删除元素的集合：" + list);
    }

    /*新讲的*//*新讲的*//*新讲的*//*新讲的*//*新讲的*//*新讲的*//*新讲的*//*新讲的*/

    /**List 提供可以获取子集方法      返回值:List<E>{Object对象}
     * subList(int start,int end)    含头不含尾
     * 作用：截取集合中范围内子集
     *
     */
    @Test
    public void testSubList(){
       //创建一个集合先  类型为Integer
    List<Integer> list=new ArrayList<>();
       //需求:添加10个元素，元素数0~9
    for(int i=0;i<10;i++){//所有集合重写父级的方法!    普通for循环
        list.add(i);//add()添加--重写:Collection-add方法
    }

    //打印集合
    System.out.println("增加元素后的集合："+list);
    List<Integer> list1=list.subList(3,9);//进行截取  需求:获取子集，获取3-8的元素
    System.out.println("获取子集："+list1);  //打印子集合  用这个东西打印出来把想要的开头带上，结尾+1

    //扩大十倍方法   先for循环
    List<Integer> list2=list.subList(2,8);
    for(int i=0;i<list2.size();i++){//获取子集的下标  并设置子集
      list2.set(i,list2.get(i)/*获取i中值*/*10/*乘以10*/);//get获取下标元素
    }
    System.out.println("乘以10："+list2);

    //删除list元素中1-7的元素,子集消除        clear清除
    List<Integer> listRem=list.subList(1,8);//进行清除
    listRem.clear();//进行删除    clear是全部删除
    System.out.println("阴间黑土"+list);//打印最初的list0-9,然后将1-7进行删除
    //总结:获取子集，打印子集没有操作，清空子集，原来集合移除部分子集
    //在list中将一部分元素提取出来用clear清除，最后打印原List的到删除后的list

}

    /**
     * 数组转集合
     * Arrays工具类:提供静态方法 asList(数组引用)
     *             asList(数组引用):这个牢底可以将数转为集合
     * 注意:
     */
     @Test
     public void testArrays() {
         //创建字符串静态数组  静态数组  静态数组
         String[] array = {"黑土", "青水", "紫狗"};//静态数组创建，给定值 初始值
         List<String> list = Arrays.asList(array);/*把定值整进来*/    //将数组转换为集合       ------软件更新
         //将list阴间集合中的"青水"改为"死水"  用.size方法进行修改
         list.set(1, "死水");//1是顺序  从0开始 青水是1 黑土是0
         // System.out.println("阴间忍者："+list);
         //增强for   添加元素[add方法   add("解斑")]
         for (String str : array) {//不同构造器不同方法  String Object
             /**
              * UnsupportedOperationException
              */
             //list.add("解斑");
         }

         /**
          * List构造器使用:传入有参构造器【类型：其他集合，功能:addAll】
          * 创建集合 List<String> lists=new ArrayList(集合引用);
          *
          */
         List<String> lists=new ArrayList<>();
         //集合构造器参数:集合引用--lists集合元素添加至listes集合中
         //替代:addAll方法  操作:并集
         List<String> listes=new ArrayList<>(lists);
     }

    /**
     * 集合排序
     * Collections 工具类
     * 静态方法:sort() 排序 [默认升序]实现List接口排序功能
     *
     *
     * java.util.Random:伪随机数类   在java.util包中
     * nextInt(数值)  功能:返回一个数值内伪随机数
     *
     * 导入包问题：通用导入方式有没有  √   通配符 * 代表所有
     *              如果类存在与util工具包下，例如:import java.util.*
     *             类最上方：import java.util.Random
     *                     import java.util.Random
     *                     import java.util.ArrayList
     *需求:创建随机生成10个元素的集合【100以内】
     */
    @Test
    public void testRandom(){
        List<Integer> list=new ArrayList<>();//创建一个集合
        //创建随机数对象
        Random random=new Random();
        //给list集合添加10个元素
        for(int i=0;i<10/*添加的数量*/;i++){//.list.size()别手写
            list.add(random.nextInt(100)/*随机数值区间内*/);//random.ne   在这里面进行随机
        }
        System.out.println("🐓："+list);
        Collections.sort(list);//进行排序由小到大  针对数值的
        System.out.println("排序后🐓："+list);

    }

    /**
     * 集合排序
     * Collections 工具类
     *
     * 面试题:Collection和Collections的区别?
     *       Collection所有集合的顶级接口,约定所有集合共有方法!
     *       Collections工具类,提供集合操作方法!
     *
     *
     * 静态方法sort(集合引用,比较器) 功能:按照比较器约定规则排序
     * Comparator 比较器
     * 需求：集合存汉字---按照要求排序【比较器】
     */
     @Test
     public void testSort(){
         List<String> list=new ArrayList<>();
         list.add("我类要一打米哟");
         list.add("五买一修蛋");
         list.add("奥里给大菠萝");
         Collections.sort(list);  //排序
         System.out.println("超哥："+list);
         //需求，按照长短排序
         //创建比较器对象  [匿名内部类]
         //比较器对象内部提供方法；针对集合排序操作【交换规则】
         Comparator<String> com=new Comparator<String>() {//new会帮我们输出
             //定义比较器规则:汉字长度排序---交换操作compare老弟会给你办了
             public int compare(String o1, String o2) {
                 return o1.length()/*获取长度*/-o2.length();
                 /**
                  * o1.length()获取第一个字符串长度
                  * o2.length()获取第二个字符串长度
                  * 汉字短的在前
                  * 返回值：大于0   假设:3-4  交换
                  *        小于0  假设:4-2 不交换
                  *        等于0  假设:3=3 不变
                  *
                  */
             }
         };//在报错的括号后面加上+;
        //比较器:规定文字短在前，使用比较器规则
         Collections.sort(list,com);
         System.out.println("按照文字长短排序:"+list);

     }

    /**
     * 总结:List集合
     *   List接口集合  是Collection容器接口的子接口
     *   List子接口---无法实例化---实现类:ArrayList,LinkedList,Vector
     *   使用情况:保存一组数据，有序情况，采用List集合
     *   List子接口方法就是ArrayList的方法?因为ArrayList重写List所有方法
     */
    @Test
    public void testArrayList(){
        //此种方法可调用父级子集方法  多态:方法一致 调用父类执行父类功能
        //                                    调用子类执行子类重写方法--与父类一致
        List<String> list=new ArrayList<>();
        list.add("三雷子");list.add("天道超");list.add("罗砂");//用get可以获取
        System.out.println(list.get(0)/*获取元素*/);
        //由list[ArrayList]保存集合,内存创建状态


        //List<String> list=new ArrayList<>();//创建集合
        //list.add("小胡子");list.set(0/*顺序*/,"无"/*修改后内容*/);/*修改代码set*///调取方法
        //用此种方式缺点为只会调用ArrayList的方法
        //ArrayList<String> arrayList=new ArrayList<>();//创建集合
        //arrayList.add("金银角");arrayList.set(0,"半藏");//也可以调取方法，和上面一样


    }

}